package com.instpower.things.service;

import com.instpower.things.config.OtaStatus;
import com.instpower.things.entity.Battery;
import com.instpower.things.entity.Cabinet;
import com.instpower.things.entity.CabinetCmdLog;

import java.util.List;
import java.util.Map;

/**
 * @ClassName InstService
 * @Author: hellmash@gmail.com
 * @Date: 2020/3/5
 * @Version: 1.0.0
 * @Description: TODO
 */
public interface InstService {

    /**
     * 检查订单状态是否可用
     * @param orderId
     * @return
     */
    Boolean checkOrderStatus(int orderId);

    /**
     * 更新电池状态
     * @param batteries
     * @return
     */
    Boolean updateBatteryStatus(String cabinetSn, List<Battery> batteries);


    /**
     * 机柜上线
     *
     * @param version   机柜固件版本
      * @return
     */
    void updateCabinetOnline(String sn, String version);

    /**
     * 机柜下线
     * @return
     */
    void updateCabinetOffline(String sn);

    /**
     * 机柜心跳更新,
     * @param sn        设备SN码
     * @param isAvailable 是否可用
     * @param rentNum   可借数量
     * @param returnNum 可还数量
     *
     */
    void updateCabinetBeat(String sn,boolean isAvailable, int rentNum, int returnNum);

    /**
     * 获取任务详情
     * @param taskId
     */
    Map<String, Object> findTaskByKey(Integer taskId);

    /**
     * 更新任务详情
     * @param taskId
     */
    void updateTask(Integer taskId, OtaStatus status);


    void updateCabinetOtaStatus(Integer taskId, OtaStatus status);


    /**
     * 获取待升级的设备
     * @param firmwareVersion
     * @param cabinetId
     * @param pageSize
     * @return
     */
    List<Map<String, Object>> findCabinet(int cabinetId, String firmwareVersion, int pageSize);

    /**
     * Redis中获取机柜缓存
     * @return
     */
    Cabinet getCachedCabinet(String cabinetSn);

    /**
     * 对比缓存机柜信息，确认是否需要进行数据库更新操作
     * @return
     */
    Boolean compareCachedCabinet(Cabinet cachedCabinet, Cabinet reportedCabinet);

    /**
     * Redis中获取电池缓存
     * @return
     */
    Battery getCachedBattery(String batterySn);

    /**
     * 对比缓存电池信息，确认是否需要进行数据库更新操作
     * @return
     */
    Boolean compareCachedBattery(Battery cachedBattery, Battery reportedBattery);

    /**
     * 获取OTA升级参数
     * @return
     */
    List<Map<String, Object>> findOtaConfig();


    /**
     * 输出机柜操作日志到数据库
     * @param log
     */
    void logCabinetCmd(CabinetCmdLog log);

    /**
     * 修改机柜心跳记录
     * @param sn
     */
    void updateCabinetLog(String sn);

    String querySystemData(String system_default_battery_power);
}
